package com.xiaoge.utils;

import com.xiaoge.entity.CourseCategory;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 菜单树的构造工具类
 */
public class CourseTreeBuilder {

    /**
     * 构造多级菜单树
     * @param menus
     * @return
     */
    public static List<CourseCategory> build(List<CourseCategory> menus){
        //封装一个方法，通过menus去解析菜单树
        //1. 定义一个最终的返回结果，这个结果中就以及解析完了menu，并且存在children中
        List<CourseCategory> menuList = new ArrayList<>();

        //2. 先找到一级菜单？ 什么仕一级菜单，parentId = 0
        for (CourseCategory menu : menus){
            //long是引用数据类型，应该是用equals（）
            if (menu.getParentId() == 0){
                //讲一级菜单添加到menuList中
                menuList.add(menu);
            }
        }

        //实现排序
        Collections.sort(menuList,CourseCategory.order());

        //3. 为一级菜单设置子菜单，getChild是递归调用的
        //现在这个集合中存放的都是一级菜单
        for (CourseCategory menu : menuList){
            //参数1：当前父级的id 参数2：就是我们所有菜单列表
            //为什么是menus？因为只有循环所有的菜单，在所有菜单中，只有parentid==menu.gatId(),才是menu的子菜单
            menu.setChildren(getChild1(menu.getId(),menus));
        }
        return menuList;
    }

    /**
     * 子方法
     **/
    private  static List<CourseCategory> getChild1(Long id, List<CourseCategory> menus) {
        //定义一个子菜单的集合
        List<CourseCategory> childrenMenu = new ArrayList<>();
        for (CourseCategory menu : menus){
            if (menu.getParentId().equals(id) ){
                childrenMenu.add(menu);
            }
        }

        //子菜单中还会存在子菜单，所以这里需要进行递归的操作
        for (CourseCategory menu : childrenMenu){
            //递归
            menu.setChildren(getChild1(menu.getId(),menus));
        }
        //实现排序
        Collections.sort(childrenMenu,CourseCategory.order());

        //递归结束
        if (childrenMenu.size() == 0){
            return null;

        }
        return  childrenMenu;
    }
}
